package com.cdu.guoxinan.www.smartcom.util;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.SimpleMailMessage;

import java.util.HashMap;
import java.util.Map;

public class EmailTool {

    // 验证码缓存 + 过期时间（5分钟）
    private static final Map<String, String> verificationCodeCache = new HashMap<>();
    private static final Map<String, Long> codeExpiryMap = new HashMap<>();

    private static JavaMailSender mailSender;

    public static void setMailSender(JavaMailSender mailSender) {
        EmailTool.mailSender = mailSender;
    }

    /**
     * 发送验证码邮件
     * @param email 收件人邮箱
     * @return 是否发送成功
     */
    public static boolean sendVerificationCode(String email) {
        if (email == null || !isValidEmail(email)) {
            return false;
        }

        String code = generateVerificationCode();

        // 缓存验证码（5分钟后过期）
        verificationCodeCache.put(email, code);
        codeExpiryMap.put(email, System.currentTimeMillis() + 5 * 60 * 1000); // 5分钟有效期

        try {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setTo(email);
            message.setSubject("智能小区管理系统 - 找回密码验证码");
            message.setText("您的验证码是：" + code + "，请勿泄露给他人。该验证码将在5分钟内有效。");
            message.setFrom("703096574@qq.com");

            mailSender.send(message);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 发送普通文本邮件
     * @param to 收件人邮箱
     * @param subject 邮件主题
     * @param content 邮件内容
     * @return 是否发送成功
     */
    public static boolean sendSimpleEmail(String to, String subject, String content) {
        if (to == null || !isValidEmail(to) || subject == null || content == null) {
            return false;
        }

        try {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setTo(to);
            message.setSubject(subject);
            message.setText(content);
            message.setFrom("703096574@qq.com"); // 可以改为配置项

            mailSender.send(message);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 校验用户输入的验证码是否正确
     * @param email 用户邮箱
     * @param inputCode 用户输入的验证码
     * @return 是否匹配
     */
    public static boolean verifyCode(String email, String inputCode) {
        if (email == null || inputCode == null) return false;

        String storedCode = verificationCodeCache.get(email);
        Long expiryTime = codeExpiryMap.get(email);

        // 检查是否存在 & 未过期
        if (storedCode != null && System.currentTimeMillis() < expiryTime) {
            return storedCode.equals(inputCode);
        }

        // 如果已过期或不存在，则清除
        clearCode(email);
        return false;
    }

    /**
     * 清除验证码
     */
    public static void clearCode(String email) {
        verificationCodeCache.remove(email);
        codeExpiryMap.remove(email);
    }

    /**
     * 校验邮箱格式
     */
    public static boolean isValidEmail(String email) {
        return email != null && email.matches("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
    }

    /**
     * 生成 6 位随机验证码
     */
    private static String generateVerificationCode() {
        int code = (int) ((Math.random() * 9 + 1) * 100000); // 生成 6 位数
        return String.valueOf(code);
    }
}

